EC2からインターネットゲートウェイを使わずにAzure ADのアクセストークンを取得してみる
いわさです。
Microsoft Graph APIなどを呼び出す場合に、Microsoft IDプラットフォームのトークンエンドポイントへアクセスする必要があります。
もしクライアントがプライベートサブネットのEC2だった場合はどうするのが良いでしょうか。
NATゲートウェイやプロキシを利用出来る環境であればそのまま利用すれば良いと思いますが、インターネットゲートウェイが利用出来ない環境の場合にどういう方法が他に取れるか考えてみました。
今回はVPCエンドポイントからプライベートAPI Gatewayを使って、HTTPバックエンドにMicrosoft IDトークンエンドポイントを指定してみます。
Azureでクライアントシークレットを用意
今回はユーザーなしアクセスの取得を前提に進めます。
ユーザーありアクセスの場合はいくつかのリダイレクトを挟む中でJavaScriptなど外部リソースの名前解決をどうにかしてやる必要がありそうです。内部DNSであればVPC内に限っては利用出来るかもしれませんがいくつか課題があったので今回はシンプルなユーザーなし認証を使います。
クライアントシークレットを用意し、アクセスが出来るようになったら、一度インターネットアクセスが可能なところでアクセスしておきましょう。
管理者の許可が要求されるので事前に許可をします。
AWSでプライベートAPI Gatewayを用意
AWS側ではプライベートAPI Gatewayを用意し、VPCからアクセスさせます。
APIのバックエンドには統合タイプHTTPでエンドポイントURLはMicrosoftのTokenエンドポイントを指定します。
https://login.microsoftonline.com//oauth2/v2.0/token
ついでに、統合URLの中でテナント情報やAPIバージョンなどの情報は吸収しておきます。
プライベートAPIの場合はリソースポリシーを設定しないとデプロイが出来ません。
今回のターゲットとなるプライベートVPCのIDを許可させます。
アクセスしてみる
ではアクセスしてみましょう。
API GatewayへアクセスするためにVPCエンドポイント(execute-api)を作成します。
また、プライベートVPCのEC2インスタンスへSSM接続したいのでSSM用のVPCエンドポイントも作成しました。
sh-4.2$ curl -X POST -d 'client_id=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' -d 'grant_type=client_credentials' -d 'client_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXx' -d 'scope=https%3A%2F%2Fgraph.microsoft.com%2F.default' https://69sw1zp36f.execute-api.ap-northeast-1.amazonaws.com/hoge/token { "token_type": "Bearer", "expires_in": 3599, "ext_expires_in": 3599, "access_token": "eyJ0eXAiOiJKV1QiL ... tkNP9pFZZSTA" }
無事にAPI GatewayからMicrosoft Graphのアクセストークンが取得出来ました。
さいごに
プライベートネットワークから外部APIへアクセスする際のひとつとしてVPCエンドポイントを通す方法を試してみました。
VPCのインターネットゲートウェイを通過せずに外部へアクセスすることが出来ました。
API GatewayからMicrosoft Graph APIへのインターネットアクセスはやはり発生するので、無条件でこれをヨシとは出来ないと思いますが、ネットワーク制約の理由によっては活用できるシーンもあるかもしれません。